#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
void armarTablero (char tablero[8][8]);
int pedirOpcion ();
void mostraTablero (char tablero[8][8]);
int moverFicha (char tablero[8][8], int &turno);
int comprobarPosicion (char tablero [8][8],int turno,int posicionf,int posicionc, int objetivof,int objetivoc);
void guardarPartida (char tablero[8][8]);
void cargarPartida (char tablero[8][8]);
int main()
{
    int flag=0;
    int turno=1;
    int opcion,opcion2;
    char tablero[8][8];
    armarTablero (tablero);
    cout<<"Bienvenidos"<<endl<<endl;
    cout<<"Menu: "<<endl<<endl;
    cout<<"1) Empezar juego"<<endl;
    cout<<"2) Cargar partida"<<endl;
    cout<<"3) Salir"<<endl<<endl;
    opcion = pedirOpcion ();
    while (opcion!=3)
    {
        switch (opcion)
        {
            case 1:
                    cout<<endl<<endl<<"Jugador 1 es X";
                    cout<<endl<<"Jugador 2 es O"<<endl;
                    while (flag!=1)
                    {
                        cout<<endl<<"Turno del Jugador "<<turno<<endl<<endl;
                        mostraTablero(tablero);
                        cout<<endl;
                        cout<<"Menu: "<<endl<<endl;
                        cout<<"1) Mover ficha"<<endl;
                        cout<<"2) Guardar"<<endl;
                        cout<<"3) Rendirse"<<endl<<endl;
                        opcion2=pedirOpcion();
                        switch (opcion2)
                        {
                            case 1:
                                    flag = moverFicha(tablero,turno);
                                    break;
                            case 2:
                                    guardarPartida(tablero);
                                    break;
                            case 3:
                                    cout<<"El Jugador "<<turno<<" pierde";
                                    flag=1;
                                    break;
                        }
                    }
                    break;
            case 2:
                    cargarPartida (tablero);
                    break;
        }
        cout<<"Menu: "<<endl<<endl;
        cout<<"1) Empezar juego"<<endl;
        cout<<"2) Cargar partida"<<endl;
        cout<<"3) Salir"<<endl<<endl;
        opcion=pedirOpcion();
    }
}
void armarTablero (char tablero[8][8])
{
    char relleno ='X';
    int i,j;
    for (i=0;i<8;i++)
    {
        for (j=1;j<8;j+=2)
        {
            if (i==1 || i==5 || i==7)
                tablero[i][j-1]=relleno;
            else
                tablero[i][j]=relleno;

        }
        if (i==2)
        {
             i+=2;
             relleno='O';
        }
    }
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
        {
            if (tablero[i][j]!='X'&&tablero[i][j]!='O')
                tablero[i][j]='-';
        }
    }
    return;
}
int pedirOpcion ()
{
    int opcion,flag;
    cout<<"Ingrese una opcion: ";
    for (flag=1;flag!=0;)
    {
        cin>>opcion;
        if (opcion<4&&opcion>0)
            flag=0;
        else
            cout<<"Error"<<endl<<"Ingrese una opcion valida: ";
    }
    return opcion;
}
void mostraTablero (char tablero [8][8])
{
    int i,j;
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
            cout<<tablero [i][j];
        cout<<endl;
    }
    return;
}
int moverFicha(char tablero[8][8], int &turno)
{
    int flag;
    int contador1 = 0;
    int contador2 = 0;
    int posicionf,posicionc,objetivof,objetivoc,i,j;
    while (flag!=0)
    {
        cout<<endl<<"Ingrese la posicion de la ficha que desea mover"<<endl;
        cout<<"Fila: ";
        cin>>posicionf;
        cout<<"Columna: ";
        cin>>posicionc;
        cout<<endl<<"Ingrese la posicion a la que desea moverse"<<endl;
        cout<<"Fila: ";
        cin>>objetivof;
        cout<<"Columna: ";
        cin>>objetivoc;
        flag=comprobarPosicion (tablero,turno,posicionf,posicionc,objetivof,objetivoc);
        if (flag!=0)
            cout<<"Error"<<endl;
    }
    if (turno==1)
    {
        flag=5;
        turno=2;
    }
    if (turno==2&&flag!=5)
        turno=1;
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
        {
            if (tablero[i][j]=='X')
                contador1++;
            if (tablero[i][j]=='O')
                contador2++;
        }
    }
    if (contador1==0)
    {
        cout<<"El jugador 1 pierde"<<endl<<"El jugador 2 gana";
        flag=1;
    }
    if (contador2==0)
    {
        cout<<"El jugador 2 pierde"<<endl<<"El jugador 1 gana";
        flag=1;
    }
    return flag;

}
int comprobarPosicion (char tablero [8][8],int turno,int posicionf,int posicionc, int objetivof,int objetivoc)
{
    int flag;
    if (objetivof<8 && objetivof>-1 && objetivoc<8 && objetivoc>-1)
    {
        if (turno==1)
        {
            if (tablero [posicionf][posicionc]=='X')
            {
                if (tablero[objetivof][objetivoc]=='-' )
                {
                    if (tablero[objetivof][objetivoc]==tablero[posicionf+1][posicionc+1]||tablero[objetivof][objetivoc]==tablero[posicionf+1][posicionc-1])
                    {
                        tablero[posicionf][posicionc]='-';
                        tablero[objetivof][objetivoc]='X';
                        flag=0;
                    }
                    if (tablero[objetivof][objetivoc]==tablero[posicionf+2][posicionc+2] && tablero[posicionf+1][posicionc+1]=='O')
                    {
                        tablero[posicionf][posicionc]='-';
                        tablero[objetivof][objetivoc]='X';
                        tablero[posicionf+1][posicionc+1]='-';
                        flag=0;
                    }
                    if (tablero[objetivof][objetivoc]==tablero[posicionf+2][posicionc-2] && tablero[posicionf+1][posicionc-1]=='O')
                    {
                        tablero[posicionf][posicionc]='-';
                        tablero[objetivof][objetivoc]='X';
                        tablero[posicionf+1][posicionc-1]='-';
                        flag=0;
                    }
                }
                else
                    flag=1;
            }
            else
                flag=1;
        }
        if (turno==2)
        {
            if (tablero [posicionf][posicionc]=='O')
            {
                if (tablero[objetivof][objetivoc]=='-' )
                {
                    if (tablero[objetivof][objetivoc]==tablero[posicionf-1][posicionc+1]||tablero[objetivof][objetivoc]==tablero[posicionf-1][posicionc-1])
                    {
                        tablero[posicionf][posicionc]='-';
                        tablero[objetivof][objetivoc]='O';
                        flag=0;
                    }
                    if (tablero[objetivof][objetivoc]==tablero[posicionf-2][posicionc+2] && tablero[posicionf-2][posicionc+1]=='X')
                    {
                        tablero[posicionf][posicionc]='-';
                        tablero[objetivof][objetivoc]='O';
                        tablero[posicionf-1][posicionc-1]='-';
                        flag=0;
                    }
                    if (tablero[objetivof][objetivoc]==tablero[posicionf-2][posicionc-2] && tablero[posicionf-1][posicionc-1]=='X')
                    {
                        tablero[posicionf][posicionc]='-';
                        tablero[objetivof][objetivoc]='O';
                        tablero[posicionf-1][posicionc+1]='-';
                        flag=0;
                    }
                }
                else
                {
                    flag=1;
                }
            }
            else
            {
                flag=1;
            }
        }
    }
    else
        flag = 1;
    return flag;
}
void guardarPartida (char tablero[8][8])
{
    int i,j;
    ofstream archivo ("damas.pow");
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
        {
            archivo << tablero [i][j];
        }
        archivo << endl;
    }
    archivo.close();
    cout<<"Partida Guardada";
    return;
}
void cargarPartida(char tablero[8][8])
{
    int i,j;
    string variable;
    ifstream archivo ("damas.pow");
    getline (archivo,variable);
    for (i=0;i<8;i++)
    {
        for (j=0;j<8;j++)
        {
            tablero[i][j]=variable[j];
        }
        getline (archivo,variable);
    }
    cout<<"Partida cargada"<<endl;
    return;
}
